﻿/**
 * 表单相关的元数据。
 */
Ext.define('Happy.metadata.mixin.MetadataOfForm', {
    /**
     * 返回表单的类名。
     * 
     * @return {String}
     */
    getFormClassName: function () {
        var me = this;

        return me.data.namespace + '.' + me.data.name.toLowerCase() + '.view.Form';
    },

    /**
     * 返回表单的类型别名。
     * 
     * @return {String}
     */
    getFormClassAlias: function () {
        var me = this;

        return me.data.name.toLowerCase() + '-form';
    },

    /**
     * 返回编辑表格的标题。
     * 
     * @return {String}
     */
    getEditFromTitle: function () {
        var me = this;

        return '编辑-' + me.getDisplayName();
    },

    /**
     * 返回新建表格的标题。
     * 
     * @return {String}
     */
    getNewFromTitle: function () {
        var me = this;

        return '新建-' + me.getDisplayName();
    },

    /**
     * 返回表单新建场景的类名。
     * 
     * @return {String}
     */
    getNewFormSceneClassName: function () {
        var me = this;

        return me.data.namespace + '.' + me.data.name.toLowerCase() + '.view.scene.NewForm';
    },

    /**
     * 返回表单编辑场景的类名。
     * 
     * @return {String}
     */
    getEditFormSceneClassName: function () {
        var me = this;

        return me.data.namespace + '.' + me.data.name.toLowerCase() + '.view.scene.EditForm';
    },

    /**
     * 返回默认的表单 items 。
     * 
     * @return {Array}
     */
    getDefaultFormItems: function () {
        var me = this;

        var properties = Ext.Array.filter(me.getProperties(), function (property) {
            return property.showInForm !== false;
        });

        return Ext.Array.map(properties, function (property) {
            var editorConfig = window.CSharpTypeMapper.getFormEditorDefaultConfig(property.dataType);

            editorConfig = Ext.apply({
                name: property.name,
                fieldLabel: property.getDisplayName()
            }, property.editorConfig || {}, editorConfig);

            if (property.editorConfigFns) {
                Ext.Array.each(property.editorConfigFns, function (editorConfigFn) {
                    editorConfigFn(me, property, editorConfig);
                });
            }

            return editorConfig;
        });
    },

    /**
     * 返回默认的表单编辑场景相关的 items，如：订单的订单项列表。
     * 
     * @return {Array}
     */
    getDefaultEditFormSceneRelatedItems: function () {
        var me = this;

        return me.getDefaultFormRelatedItems();
    },

    /**
     * 返回默认的表单新建场景相关的 items，如：订单的订单项列表。
     * 
     * @return {Array}
     */
    getDefaultNewFormSceneRelatedItems: function () {
        var me = this;

        return Ext.Array.filter(me.getDefaultFormRelatedItems(),
            function (item) {
                return item.metadata.isLifeCycleDependent();
            });
    },

    /**
     * 返回默认的表单相关的 items，如：订单的订单项列表。
     * 
     * @return {Array}
     */
    getDefaultFormRelatedItems: function () {
        var me = this;

        if (!me.data.relation) {
            return [];
        }

        return me.getDefaultFormOneToManyRelatedItems();
    },

    /**
     * 返回默认的表单相关的 1：N items，如：订单的订单项列表。
     * 
     * @return {Array}
     */
    getDefaultFormOneToManyRelatedItems: function () {
        var me = this;

        if (!me.data.relation.hasMany) {
            return [];
        }

        return Ext.Array.map(me.data.relation.hasMany, function (item) {
            return {
                title: item.metadata.getDisplayName(),
                xtype: item.metadata.getGridClassAlias(),
                plural: item.metadata.data.plural,
                metadata: item.metadata,
                autoLoad: false
            };
        });
    }
});